// Ce programme illustre la propagation de contrainte sur les intervalles
// On considère un circuit électrique simple comprenant une pile E et deux résistances
// en serie R1 et R2. Soit I le courant dans le circuit U1 et U2 les tensions aux bornes 
// de R1 et R2, P la puissance délivrée par la pile. Toutes ces quantités sont réliées par 
// les contraintes (primitives) suivantes :   
// 	E=R12*I,R12=R1+R2,E*I=P,U2=R2*I,U1=R1*I,U1+U2=E 
// Pour information, les vraies valeurs pour les grandeurs utilisées sont : 
//   	R1=2,R3=3,R12=5,I=5,E=25,U1=10,U2=15,P=125.

//--------------------------------------------------------
/////////////// DEFINITION DU CALCUL SUR LES INTERVALLES
//--------------------------------------------------------
function z=inter(x,y)
	z=[max(x(1),y(1)),min(x(2),y(2))]
	if (z(2)<z(1)) then write ('intervalle vide'); end;
endfunction
//-----------------------------------------
function z=plus(x,y)
	z=x+y;
endfunction
//-----------------------------------------
function z=moins(x,y)
	z=[x(1)-y(2),x(2)-y(1)];
endfunction
//-----------------------------------------
function z=fois(x,y)
	v=[x(1)*y(1),x(1)*y(2),x(2)*y(1),x(2)*y(2)];
	z=[min(v),max(v)];
endfunction
//-----------------------------------------
function y=inverse(x)
	if and([x(1)<=0,x(2)>=0]) then y=[-999999,9999999];
     				  else y=[1/x(2),1/x(1)];
	end 
endfunction
//-----------------------------------------
function z=divise(x,y)
	a=inverse(y); 
	z=fois(x,a);
endfunction
//-----------------------------------------------------------------------
/////////////// DEFINITION DES OPERATEURS DE CONTRACTIONS ELEMENTAIRES
//-----------------------------------------------------------------------
function [z1,x1,y1]=PADD(z,x,y)
	z1 = inter(z,plus(x,y));
	x1 = inter(x,moins(z,y));
	y1 = inter(y,moins(z,x));
endfunction
//-----------------------------------------
function [z1,x1,y1]=PMULT(z,x,y)
	z1 = inter(z,fois(x,y));
	x1 = inter(x,divise(z,y));
	y1 = inter(y,divise(z,x));
endfunction
//------------------------------------------------------------------------
/////////////// 	PROGRAMME PRINCIPAL
//------------------------------------------------------------------------

// Domaines a priori sur les variables : 
R12=[-1e20,1e20]; R1=[0,1e20]; R2=[0,1e20]; E=[23,26]; I=[4,8];
U1=[10,11]; U2=[14,17]; P=[124,130];

// Propagation des contraintes
for i=1:20,
     [R12,R1,R2]=PADD(R12,R1,R2);
     [P,E,I]=PMULT(P,E,I);
     [E,R12,I]=PMULT(E,R12,I);
     [U2,R2,I]=PMULT(U2,R2,I);
     [U1,R1,I]=PMULT(U1,R1,I);
     [E,U1,U2]=PADD(E,U1,U2);
end; 

disp(R1)
disp(R2)
disp(I)
disp(U1)
disp(U2)
disp(E)
disp(P)

